// file: 二进制文件

#include <stdio.h>
#include "student.h"

void getList(Student aStu[], int number);
int save(Student aStu[], int number);

int main(int argc, char const *argv[])
{
    // 文本 vs 二进制
    // Unix 喜欢文本文件，Windows（Dos）喜欢二进制文件
    // 文本方便人类读写，而且跨平台；缺点是输入输出需要格式化，开销大
    // 二进制读写困难，不跨平台，但是程序读写快

    // 程序为什么要文件？
    // -配置
    //    - Unix用文本，Windows用注册表
    // - 数据
    // - 媒体

    // 二进制读写
    // size_t fread(void* restrict ptr, size_t size, \
    //     size_t nitems, FILE* restrict stream);
    // size_t fwrite(const void* restrict ptr, size_t size, \
    //     size_t nitems, FILE* restrict stream);
    // 参数：要读写的内存的指针；内存的大小；有几个这样的内存；文件指针
    // * nitems: 二进制文件的读写一般都是通过对一个结构变量的操作来进行的
    //   nitem就使用来说明这次读写几个结构变量
    // 返回的是成功读写的字节数

    // eg
    int number = 0;
    printf("Input the number of students\n");
    scanf("%d", &number);
    Student aStu[number];

    getList(aStu, number);
    if (save(aStu, number))
    {
        printf("Saving succeeded!\n");
    }
    else
    {
        printf("Saving failed!\n");
    }
    
    return 0;
}

void getList(Student aStu[], int number)
{
    char format[STR_LEN];
    // 向一个字符串输出
    // %%: 表示输出 %
    // %d: STR_LEN - 1
    // 组合起来: %19s
    sprintf(format, "%%%ds", STR_LEN - 1);

    int i;
    for (i = 0; i < number; i++)
    {
        printf("No.%d student\n", i);
        printf("\tName: ");
        scanf(format, aStu[i].name);
        printf("\tGender(0-male, 1-female, 2-others): ");
        scanf("%d", &aStu[i].gender);
        printf("\tAge: ");
        scanf("%d", &aStu[i].age);
    }
}

int save(Student aStu[], int number)
{
    int ret = -1;
    FILE* fp = fopen("student.data", "w");
    if (fp)
    {
        ret = fwrite(aStu, sizeof(Student), number, fp);
        fclose(fp);
    }

    return ret == number;
}